1
2
다음
가장 간단한 용어로 git pull은 git fetch와 git merge를 수행합니다.
refs / remotes / /에서 원격 추적 분기를 업데이트하기 위해 언제든지 git fetch를 수행 할 수 있습니다.
이 작업은 refs / heads 아래의 로컬 브랜치를 변경하지 않으며 작업 복사본을 변경하지 않고 수행하는 것이 안전합니다. 나는 심지어 백그라운드에서 cron 작업에서 주기적으로 git fetch를 실행하는 사람들에 대해 들어 본 적이있다 (권장하지는 않겠지 만).
git pull은 로컬 브랜치를 원격 버전으로 최신 상태로 유지하는 동시에 다른 원격 추적 브랜치를 업데이트하기 위해 수행하는 작업입니다.
git pull에 대한 Git 문서에서 :
기본 모드에서 git pull은 git fetch와 git merge FETCH_HEAD의 약자입니다.
|
pull을 사용할 때 Git은 자동으로 작업을 수행합니다. 상황에 따라 달라 지므로 Git은 가져온 커밋을 현재 작업중인 브랜치에 병합합니다. pull은 커밋을 먼저 검토하지 않고 자동으로 병합합니다. 지점을 면밀히 관리하지 않으면 잦은 충돌이 발생할 수 있습니다.
가져올 때 Git은 현재 브랜치에 존재하지 않는 대상 브랜치에서 커밋을 수집하여 로컬 저장소에 저장합니다. 그러나 현재 분기와 병합되지는 않습니다. 이는 저장소를 최신 상태로 유지해야하지만 파일을 업데이트하면 손상 될 수있는 작업을 수행하는 경우 특히 유용합니다.
커밋을 마스터 브랜치에 통합하려면 merge를 사용합니다.
|
git의 디자인 철학을 SVN과 같은보다 전통적인 소스 제어 도구의 철학과 대조하는 것이 중요합니다.
Subversion은 클라이언트 / 서버 모델로 설계 및 구축되었습니다. 서버 인 단일 저장소가 있으며 여러 클라이언트가 서버에서 코드를 가져 와서 작업 한 다음 다시 서버에 커밋 할 수 있습니다. 클라이언트는 작업을 수행해야 할 때 항상 서버에 연결할 수 있다고 가정합니다.
Git은 중앙 저장소가 필요하지 않은보다 분산 된 모델을 지원하도록 설계되었습니다 (원하는 경우 확실히 사용할 수 있음). 또한 git은 클라이언트와 "서버"가 동시에 온라인 상태 일 필요가 없도록 설계되었습니다. Git은 신뢰할 수없는 링크에있는 사람들이 이메일을 통해 코드를 교환 할 수 있도록 설계되었습니다. 완전히 분리 된 상태에서 작업하고 git을 통해 코드를 교환하기 위해 CD를 구울 수 있습니다.
이 모델을 지원하기 위해 git은 코드가있는 로컬 저장소와 원격 저장소의 상태를 미러링하는 추가 로컬 저장소를 유지합니다. 원격 저장소의 복사본을 로컬에 보관함으로써 git은 원격 저장소에 도달 할 수없는 경우에도 필요한 변경 사항을 파악할 수 있습니다. 나중에 다른 사람에게 변경 사항을 보내야 할 때 git은 원격 저장소에 알려진 시점에서 변경 사항 집합으로 변경할 수 있습니다.
git fetch는 "원격 저장소의 로컬 사본을 최신 상태로 유지"하는 명령입니다.
git pull은 "원격 저장소의 변경 사항을 내 코드를 보관하는 곳으로 가져옵니다."라고 말합니다.
일반적으로 git pull은 git fetch를 수행하여 원격 저장소의 로컬 복사본을 최신 상태로 가져온 다음 변경 사항을 자신의 코드 저장소와 작업 복사본에 병합하여이를 수행합니다.
중요한 점은 워크 스테이션에 프로젝트 사본이 세 개 이상있는 경우가 많다는 점을 명심하는 것입니다. 하나의 복사본은 자신의 커밋 기록이있는 자신의 저장소입니다. 두 번째 사본은 편집 및 작성중인 작업 사본입니다. 세 번째 사본은 원격 저장소의 로컬 "캐시 된"사본입니다.
|
모든 것이 어떻게 조화를 이루는 지에 대한 Oliver Steele의 이미지입니다.
충분한 관심이 있다면 이미지를 업데이트하여 git clone과 git merge를 추가 할 수 있다고 가정합니다.
|
git fetch의 한 가지 사용 사례는 다음이 마지막 풀 이후 원격 브랜치의 변경 사항을 알려주는 것입니다. 따라서 실제 풀을 수행하기 전에 확인할 수 있으며, 이는 현재 브랜치 및 작업 복사본의 파일을 변경할 수 있습니다.
자식 가져 오기
git diff ... origin
diff 명령의 이중 및 삼중 점 구문에 대해서는 https://git-scm.com/docs/git-diff를 참조하십시오.
|
차이점이 무엇인지 이해하는 데 약간의 비용이 들지만 이것은 간단한 설명입니다. 로컬 호스트의 마스터는 분기입니다.
저장소를 복제 할 때 전체 저장소를 로컬 호스트로 가져옵니다. 이것은 그 때 HEAD에 대한 원점 / 마스터 포인터와 동일한 HEAD를 가리키는 마스터가 있음을 의미합니다.
작업을 시작하고 커밋을 수행하면 마스터 포인터를 HEAD + 커밋으로 이동합니다. 그러나 원본 / 마스터 포인터는 여전히 복제했을 때의 포인터를 가리 킵니다.
따라서 차이점은 다음과 같습니다.
git fetch를 수행하면 원격 저장소 (GitHub)의 모든 변경 사항을 가져오고 원본 / 마스터 포인터를 HEAD로 이동합니다. 한편, 로컬 브랜치 마스터는 그것이있는 곳을 계속 가리킬 것입니다.
git pull을 수행하면 기본적으로 이전에 설명한대로 가져 오기를 수행하고 새로운 변경 사항을 병합합니다.마스터 분기를 클릭하고 포인터를 HEAD로 이동합니다.
|
때때로 시각적 표현이 도움이됩니다.
|
간단히
git fetch는 pull과 유사하지만 병합되지 않습니다. 즉, 원격 업데이트 (refs 및 객체)를 가져 오지만 로컬은 동일하게 유지됩니다 (즉, origin / master가 업데이트되지만 마스터는 동일하게 유지됨).
git pull은 원격에서 끌어 내리고 즉시 병합됩니다.
더
git clone은 저장소를 복제합니다.
git rebase는 업스트림 브랜치에없는 현재 브랜치의 항목을 임시 영역에 저장합니다. 이제 브랜치는 변경을 시작하기 전과 동일합니다. 따라서 git pull -rebase는 원격 변경 사항을 풀다운하고, 로컬 브랜치를 되 감고, 최신 상태가 될 때까지 현재 브랜치의 상단에 변경 사항을 하나씩 재생합니다.
또한 git branch -a는 모든 브랜치 (로컬 및 원격)에서 무슨 일이 일어나고 있는지 정확하게 보여줍니다.
이 블로그 게시물은 유용했습니다.
git pull, git fetch 및 git clone (및 git rebase)의 차이점-Mike Pearce
git pull, git fetch, git clone 및 git rebase를 다룹니다.
====
최신 정보
나는 이것을 실제로 어떻게 사용하는지 보여주기 위해 이것을 업데이트 할 것이라고 생각했습니다.
원격에서 로컬 리포지토리를 업데이트합니다 (병합하지 마십시오).
자식 가져 오기
업데이트를 다운로드 한 후 차이점을 살펴 보겠습니다.
git diff master origin / master
이러한 업데이트에 만족하면 다음을 병합하십시오.
git pull
메모:
2 단계 : 로컬과 원격의 차이점에 대한 자세한 내용은 로컬 git 브랜치를 원격 브랜치와 비교하는 방법을 참조하세요.
3 단계 : 여기서 git rebase origin을 수행하는 것이 더 정확할 것입니다 (예 : 빠르게 변경되는 저장소에서). 다른 답변에서 @Justin Ohms 주석을 참조하십시오.
참조 : http://longair.net/blog/2009/04/16/git-fetch-and-merge/
|
git-pull-다른 저장소 또는 로컬 브랜치에서 가져 와서 병합
개요
git pull…
기술
주어진 매개 변수로 git-fetch를 실행하고 git-merge를 호출하여
검색된 헤드를 현재 분기로 가져 왔습니다. --rebase를 사용하면 git-rebase를 호출합니다.
git-merge 대신.
사용할 수 있습니다. (현재 디렉터리)를 가져올 로
로컬 저장소에서 — 로컬 브랜치를 병합 할 때 유용합니다.
현재 분기로.
또한 git-pull 자체 및 기본 git-merge를위한 옵션
git-fetch를위한 옵션 앞에 제공되어야합니다.
이력을 병합하려면 당기고, 어떤 사람이 여기 주변의 일부 기사에 태그를 달았 기 때문에 'codez'를 원하면 가져올 것입니다.
|
원격 저장소에서 가져 와서 차이점을 확인한 다음 가져 오거나 병합 할 수 있습니다.
다음은 origin이라는 원격 저장소와 원격 지점 origin / master를 추적하는 master라는 지점에 대한 예입니다.
git checkout master
자식 가져 오기
git diff origin / master
git rebase origin master
|
짧고 쉬운 대답은 git pull이 단순히 git fetch 다음에 git merge라는 것입니다.
git pull이 원하든 원하지 않든 자동으로 병합된다는 점에 유의하는 것이 매우 중요합니다. 물론 이것은 병합 충돌을 일으킬 수 있습니다. 리모컨이 원점이고 분기가 마스터라고 가정 해 보겠습니다. pull하기 전에 origin / master를 git diff하면 잠재적 인 병합 충돌에 대한 아이디어가 있어야하며 그에 따라 로컬 브랜치를 준비 할 수 있습니다.
끌어 오기 및 밀어 넣기 외에도 일부 워크 플로에는 다음과 같은 git rebase가 포함됩니다.
git pull origin master
git checkout foo-branch
자식 리베이스 마스터
git push origin foo-branch
그러한 상황에 처해 있다면 git pull --rebase를 시도 할 수 있습니다. 당신이 정말로 당신이 무엇을하는지 정말로 알지 못한다면, 나는 그것에 반대 할 것입니다. 이 경고는 git-pull 버전 2.3.5의 man 페이지에서 발췌 한 것입니다.
이것은 잠재적으로 위험한 작동 모드입니다. 다시 쓴다
그 역사를 출판했을 때 좋은 징조가 아닙니다.
이미. git-rebase (1)을 읽지 않았다면이 옵션을 사용하지 마십시오.
조심스럽게.
|
좋아, 여기 git pull과 git fetch에 대한 정보가 있으므로 실제 차이점을 이해할 수 있습니다 ... 몇 가지 간단한 단어로 fetch는 최신 데이터를 가져 오지만 코드 변경 사항은 가져 오지 않고 현재 로컬 브랜치 코드를 엉망으로 만들지 않습니다. 하지만 코드 변경 사항을 가져 와서 로컬 브랜치에 병합하고 각각에 대한 자세한 내용을 보려면 계속 읽으십시오.
자식 가져 오기
모든 참조 및 개체와 모든 새 분기를 로컬 저장소로 다운로드합니다.
하나 이상의 브랜치 및 / 또는 태그 (통칭하여 "참조")를 가져옵니다.
완료하는 데 필요한 개체와 함께 다른 저장소
역사. 원격 추적 분기가 업데이트되었습니다 (설명 참조
이 동작을 제어하는 방법은 아래 참조).
기본적으로 가져 오는 기록을 가리키는 태그는
또한 가져 왔습니다. 효과는 분기를 가리키는 태그를 가져 오는 것입니다.
관심이 있습니다.이 기본 동작은 다음을 사용하여 변경할 수 있습니다.
--tags 또는 --no-tags 옵션을 사용하거나
remote..tagOpt. 태그를 명시 적으로 가져 오는 refspec을 사용하면
관심있는 브랜치를 가리 키지 않는 태그를 가져올 수 있습니다.
뿐만 아니라.
git fetch는이름이 지정된 단일 저장소 또는 URL 또는
주어진 경우 한 번에 여러 저장소에서
리모컨. 구성 파일의 항목. (git-config1 참조).
원격이 지정되지 않은 경우 기본적으로 원래 원격은
현재 사용하도록 구성된 업스트림 분기가없는 경우
분기.
객체 이름과 함께 가져온 참조의 이름
그들은 .git / FETCH_HEAD에 기록됩니다. 이 정보는
스크립트 또는 git-pull과 같은 다른 git 명령에서 사용됩니다.
git pull
원격에서 로컬의 현재 분기로 변경 사항을 적용합니다.
원격 저장소의 변경 사항을 현재 분기에 통합합니다.
기본 모드에서 git pull은 git fetch의 축약 형이고 뒤에 오는
git merge FETCH_HEAD.
더 정확하게는 git pull은 주어진 매개 변수로 git fetch를 실행하고
git merge를 호출하여 검색된 분기 헤드를 현재
분기. --rebase를 사용하면 git merge 대신 git rebase를 실행합니다.
전달 된 원격 저장소의 이름이어야합니다.
git-fetch1. 임의의 원격 참조의 이름을 지정할 수 있습니다 (예 :
태그의 이름) 또는 해당하는 참조 모음
원격 추적 분기 (예 : refs / heads / : refs / remotes / origin /),
그러나 일반적으로 원격 저장소의 브랜치 이름입니다.
및의 기본값은
에 의해 설정된 현재 분기에 대한 "원격"및 "병합"구성
git-branch --track.
나는 또한 git fetch와 git pull이 함께 작동하는 방법을 보여주기 위해 아래 비주얼을 만듭니다.
|
이 대화 형 그래픽 표현은 git을 이해하는 데 매우 유용합니다. http://ndpsoftware.com/git-cheatsheet.html
git fetch는 원격 저장소에서 로컬 저장소로 변경 사항을 "다운로드"합니다. git pull은 변경 사항을 다운로드하고 현재 브랜치에 병합합니다. "기본 모드에서 git pull은 git fetch에 이어 git merge FETCH_HEAD가 이어집니다."
|
보너스:
위 답변에서 pull & fetch에 대해 이야기하면서 흥미로운 트릭을 공유하고 싶습니다.
git pull --rebase
위의 명령은 많은 시간을 절약 한 git 생활에서 가장 유용한 명령입니다.
새 커밋을 서버에 푸시하기 전에이 명령을 시도하면 최신 서버 변경 사항 (가져 오기 + 병합 사용)이 자동으로 동기화되고 커밋이 git 로그의 맨 위에 배치됩니다. 수동 당기기 / 병합에 대해 걱정할 필요가 없습니다.
자세한 내용은 http://gitolite.com/git-pull--rebase를 참조하십시오.
|
나는 이러한 것들을 파악하기 위해 상황을 시각적으로 표현하는 것을 좋아합니다. 다른 개발자도보고 싶어 할 수 있으므로 여기에 추가 내용이 있습니다. 모든 것이 정확하다고 확신 할 수 없으므로 실수를 발견하면 의견을 말하십시오.
로컬 시스템
. ================================================ ===
=================. ================= ===============================
원격 저장소. 원격 리포지토리 로컬 리포지토리 작업 복사본
(오리진). (캐시 됨)
예 :. 의 거울
github 저장소. . 원격 저장소
또한.
여러 저장소의.
.
.
FETCH * ------------------> *
원격의 로컬 캐시가 원본 (또는 여러
외부 소스, 즉 git의 분산 특성)
.
당기기 * ------------------------------------------------ --------> *
변경 사항은 로컬 사본에 직접 병합됩니다. 갈등이 발생하면
결정을 요구받습니다.
.
커밋. * <--------------- *
예를 들어 Subversion에서 올 때 커밋이
오리진을 업데이트합니다. git에서 커밋은 로컬 저장소에만 수행됩니다.
.
푸시 * <--------------------------------------- *
변경 사항을 원본으로 다시 동기화합니다.
원격 미러를 가져 오면 다음과 같은 몇 가지 주요 이점이 있습니다.
성능 (네트워크를 통해 압축하지 않고 모든 커밋 및 메시지 스크롤)
로컬 리포지토리의 상태에 대한 피드백 (예 : Atlassian의 SourceTree를 사용합니다. 그러면 원본에 비해 커밋이 앞서 있는지 뒤처 졌는지 나타내는 전구가 표시됩니다.이 정보는 GIT FETCH로 업데이트 할 수 있습니다).
|
나는 이것으로도 어려움을 겪었습니다. 사실 나는 정확히 같은 질문에 대한 구글 검색으로 여기에 왔습니다. 이 모든 답변을 읽으면서 마침내 내 머릿속에 그림이 그려졌고 나는 2 개의 저장소와 1 개의 샌드 박스의 상태와 그것들의 버전을 보면서 시간이 지남에 따라 수행 된 작업을 살펴보기로 결정했습니다. 그래서 여기에 제가 생각 해낸 것이 있습니다. 내가 어디서든 엉망이 된 경우 수정하십시오.
가져 오기가있는 세 개의 저장소 :
--------------------- ----------------------- ------ -----------------
-원격 저장소--원격 저장소--원격 저장소-
---밀린다---
-@ R01--@ R02--@ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------------------------------
-로컬 레포--로컬 레포--로컬 레포-
-당기기----가져 오기-
-@ R01--@ R01--@ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
-로컬 샌드 박스--로컬 샌드 박스--로컬 샌드 박스-
-체크 아웃--새로운 작업 완료---
-@ R01--@ R01 +--@ R01 +-
--------------------- ----------------------- ------ -----------------
끌어 당기는 세 가지 저장소
--------------------- ----------------------- ------ -----------------
-원격 저장소--원격 저장소--원격 저장소-
---밀린다---
-@ R01--@ R02--@ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
-로컬 레포--로컬 레포--로컬 레포-
-당기다----당기다-
-@ R01--@ R01--@ R02-
--------------------- ----------------------- ------ -----------------
--------------------- ----------------------- ------ -----------------
-로컬 샌드 박스--로컬 샌드 박스--로컬 샌드 박스-
-체크 아웃--새 작업 완료--R02와 병합-
-@ R01--@ R01 +--@ R02 +-
--------------------- ----------------------- ------ -----------------
이것은 가져 오기가 왜 중요한지 이해하는 데 도움이되었습니다.
|
GIT Fetch와 GIT Pull의 차이점은 다음 시나리오로 설명 할 수 있습니다.
(그림이 말보다 더 큰 소리를 낸다는 점을 염두에두고, 그림 표현을 제공했습니다)
팀원들과 함께 프로젝트를 진행하고있는 예를 들어 보겠습니다. 따라서 프로젝트의 메인 브랜치가 하나 있고 모든 기여자는이를 자체 로컬 저장소로 포크 한 다음이 로컬 브랜치에서 모듈을 수정 / 추가 한 다음 메인 브랜치로 푸시 백해야합니다.
그래서,
로컬 저장소에서 메인 프로젝트를 분기했을 때 두 브랜치의 초기 상태는 다음과 같습니다. (A, B 및 C는 프로젝트에서 이미 완료된 모듈입니다)
이제 새 모듈 (D라고 가정) 작업을 시작했으며 D 모듈을 완료하면이를 메인 브랜치로 푸시하고 싶습니다.하지만 동시에 팀원 중 한 명이 새로운 모듈 E, F를 개발했습니다. 수정 된 C.
이제 발생한 것은 로컬 저장소가 프로젝트의 원래 진행 상황보다 부족하여 변경 사항을 메인 브랜치로 푸시하면 충돌을 일으키고 모듈 D가 오작동 할 수 있다는 것입니다.
이러한 문제를 방지하고 프로젝트의 원래 진행 상황과 병행하여 작업하려면 두 가지 방법이 있습니다.
1. Git Fetch- 로컬 브랜치에없는 오리진 / 메인 브랜치 프로젝트에 적용된 모든 변경 사항을 다운로드합니다. 그리고 Git Merge 명령이 리포지토리 또는 브랜치에 가져온 변경 사항을 적용하기를 기다립니다.
이제 파일을 저장소에 병합하기 전에주의 깊게 모니터링 할 수 있습니다. 또한 수정 된 C 때문에 필요한 경우 D를 수정할 수도 있습니다.
2. Git Pull- 이것은 오리진 / 메인 브랜치로 로컬 브랜치를 업데이트 할 것입니다. 즉, 실제로하는 일은 Git Fetch와 Git 병합의 조합입니다.
그러나 이로 인해 충돌이 발생할 수 있으므로 깨끗한 복사본과 함께 Git Pull을 사용하는 것이 좋습니다.
|
우리는 단순히 다음과 같이 말합니다.
git pull == git fetch + git merge
git pull을 실행하면 데이터를 로컬에 병합 할 필요가 없습니다. git fetch를 실행하면 최신 코드를 로컬 머신에 가져 오기 위해 git merge를 실행해야합니다. 그렇지 않으면 로컬 기계 코드가 병합없이 변경되지 않습니다.
따라서 Git Gui에서 가져 오기를 할 때 데이터를 병합해야합니다. Fetch 자체는 로컬에서 코드를 변경하지 않습니다. 가져 와서 코드를 업데이트 할 때 확인할 수 있습니다.
한 번 가져 와서 본다. 코드는 변경되지 않습니다. 그런 다음 병합 ... 변경된 코드를 볼 수 있습니다.
|
git fetch는 원격 서버에서 로컬 저장소의 추적 분기로 코드를 가져옵니다. 원격이 origin (기본값)으로 명명 된 경우 이러한 분기는 origin / 내에 있습니다 (예 : origin / master, origin / mybranch-123 등). 현재 분기가 아니라 서버에서 해당 분기의 로컬 복사본입니다. .
git pull은 git fetch를 수행하지만 추적 분기의 코드를 현재해당 지점의 로컬 버전. 아직 그 변경 사항에 대한 준비가되지 않았다면 먼저 git fetch.
|
git fetch는 원격 브랜치를 검색하여 git diff 또는 git을 현재 브랜치와 병합 할 수 있습니다. git pull은 현재 브랜치가 추적하는 원격 브랜치에서 fetch를 실행 한 다음 결과를 병합합니다. git fetch를 사용하여 로컬 브랜치와 병합 할 필요없이 원격 브랜치에 대한 업데이트가 있는지 확인할 수 있습니다.
|
힘내 가져 오기
가져 오기를 통해 오리진에서 로컬 브랜치에 대한 변경 사항을 다운로드합니다. Fetch는 다른 사람이 만든 모든 커밋에 대해 원격 저장소에 요청하지만 로컬 저장소에는 없습니다. Fetch는 이러한 커밋을 다운로드하여 로컬 저장소에 추가합니다.
힘내 병합
merge 명령을 사용하여 가져 오기를 통해 다운로드 한 변경 사항을 적용 할 수 있습니다. Merge는 가져 오기에서 검색된 커밋을 가져와 로컬 브랜치에 추가하려고합니다. 병합은 로컬 변경 사항의 커밋 기록을 유지하므로 푸시와 브랜치를 공유 할 때 Git이 다른 사용자가 변경 사항을 병합 할 수있는 방법을 알 수 있습니다.
힘내 풀
가져 오기 및 병합은 둘을 결합하는 명령 인 pull이 생성 될만큼 자주 함께 실행됩니다. 풀은 가져 오기를 수행 한 다음 병합을 수행하여 다운로드 한 커밋을 로컬 브랜치에 추가합니다.
|
간단히 말해서 인터넷에 연결되지 않은 비행기에 타려고한다면 출발하기 전에 그냥 git fetch origin 를 할 수 있습니다. 모든 변경 사항을 컴퓨터로 가져 오지만 로컬 개발 / 작업 공간과는 별도로 유지합니다.
비행기에서 로컬 작업 공간을 변경 한 다음 가져온 것과 병합하고 인터넷에 연결하지 않고도 잠재적 병합 충돌을 해결할 수 있습니다. 그리고 누군가가 원격 저장소를 새로 변경하지 않았다면 목적지에 도착하면 git push origin 를하고 커피를 가져 오세요.
이 멋진 Atlassian 튜토리얼에서 :
git fetch 명령은 커밋, 파일 및 참조를
원격 저장소를 로컬 저장소에 추가합니다.
가져 오기는 다른 사람들이 가지고있는 것을보고 싶을 때하는 것입니다.
작업 중입니다. SVN 업데이트와 유사합니다.
중앙의 역사가 어떻게 발전해 왔는지를 강요하지는 않습니다.
실제로 변경 사항을 저장소에 병합합니다. 힘내 분리
기존 로컬 콘텐츠에서 가져온 콘텐츠는 절대적으로
지역 개발 작업에 영향을 미치지 않습니다. 가져온 콘텐츠는 git checkout 명령을 사용하여 명시 적으로 체크 아웃해야합니다. 이것은 만든다
커밋을 통합하기 전에 안전하게 검토 할 수있는 방법 가져 오기
로컬 저장소.
원격 저장소에서 콘텐츠를 다운로드 할 때 git pull 및 git fetch 명령을 사용하여 작업을 수행 할 수 있습니다. 고려할 수 있습니다
git은 두 명령의 '안전한'버전을 가져옵니다. 다운로드됩니다
원격 콘텐츠이지만 로컬 저장소의 작업 상태는 업데이트하지 않습니다.
현재 작업을 그대로 둡니다. git pull이 더 공격적입니다.
또는 활성 로컬에 대한 원격 콘텐츠를 다운로드합니다.
분기하고 즉시 git merge를 실행하여 병합 커밋을 만듭니다.
새로운 원격 콘텐츠를 위해. 진행중인 보류중인 변경 사항이있는 경우
이것은 충돌을 일으키고 병합 충돌 해결을 시작합니다.
흐름.
git pull 사용 :
당신은 어떤 고립도 얻지 못합니다.
명시 적으로 체크 아웃 할 필요가 없습니다. 암시 적으로 git 병합을 수행하기 때문입니다.
병합 단계는 지역 개발에 영향을 미치고 충돌을 일으킬 수 있습니다.
기본적으로 안전하지 않습니다. 공격적입니다.
.git / refs / remotes에만 영향을 미치는 git fetch와 달리 git pull은 .git / refs / remotes 및 .git / refs / heads / 모두에 영향을 미칩니다.
음 ... 그래서 git fetch로 작업 복사본을 업데이트하지 않으면 어디에서 변경합니까? Git fetch는 새 커밋을 어디에 저장합니까?
좋은 질문입니다. 작업 복사본에서 격리 된 어딘가에 배치합니다. 그러나 다시 어디? 알아 보자.
프로젝트 디렉토리 (즉, git 명령을 수행하는 위치)에서 다음을 수행하십시오.
ls. 파일 및 디렉토리가 표시됩니다. 멋진 건 없어요.
이제 ls -a를 수행하십시오. 이것은 도트 파일, 즉. 그러면 .git이라는 디렉토리를 볼 수 있습니다.
cd .git을 수행하십시오. 이것은 분명히 디렉토리를 변경합니다.
이제 재미있는 부분이 있습니다. do ls. 디렉토리 목록이 표시됩니다. 심판을 찾고 있습니다. cd refs를 수행하십시오.
모든 디렉토리 안에 무엇이 있는지 보는 것은 흥미롭지 만 그중 두 가지에 집중 해 보겠습니다. 머리와 리모컨. CD를 사용하여 내부를 확인하십시오.
모든 git 가져 오기는 /.git/refs/remotes 디렉토리의 항목을 업데이트합니다. /.git/refs/heads 디렉토리의 내용은 업데이트되지 않습니다.
모든 git pull은 먼저 git fetch를 수행하고 /.git/refs/remotes 디렉토리의 항목을 업데이트 한 다음 로컬과 병합 한 다음 /.git/refs/heads 디렉토리 내에서 헤드를 변경합니다.
아주 좋은 관련 답변은 Where does 'git fetch'place self?에서 찾을 수 있습니다.
또한 Git 분기 명명 규칙 게시물에서 "슬래시 표기법"을 찾으십시오. Git이 물건을 배치하는 방법을 더 잘 이해하는 데 도움이됩니다.다른 디렉토리.
실제 차이를 보려면
그냥 해:
git fetch origin master
git checkout master
원격 마스터가 업데이트 된 경우 다음과 같은 메시지가 표시됩니다.
당신의 브랜치는 2 개의 커밋에 의해 'origin / master'뒤에 있으며 빨리 감기가 가능합니다.
( "git pull"을 사용하여 로컬 브랜치를 업데이트)
가져 오지 않고 git checkout master 만했다면 로컬 git은 2 개의 커밋이 추가되었음을 알 수 없습니다. 그리고 그것은 다음과 같이 말할 것입니다.
이미 '마스터'에
지점이 '원산지 / 마스터'로 최신 상태입니다.
그러나 그것은 구식이고 부정확합니다. git은 자신이 알고있는 것만 기반으로 피드백을 제공하기 때문입니다. 아직 풀리지 않은 새로운 커밋을 알지 못합니다.
지점에서 로컬로 작업하는 동안 원격에서 이루어진 새로운 변경 사항을 볼 수있는 방법이 있습니까?
일부 IDE (예 : Xcode)는 매우 똑똑하고 git fetch의 결과를 사용하며 현재 작업중인 분기의 원격 분기에서 변경된 코드 줄에 주석을 달 수 있습니다. 해당 라인이 로컬 변경 및 원격 분기에 의해 변경된 경우 해당 라인은 빨간색으로 주석 처리됩니다. 이것은 병합 충돌이 아닙니다. 잠재적 인 병합 충돌입니다. 원격 브랜치에서 git pull을 수행하기 전에 향후 병합 충돌을 해결하는 데 사용할 수있는 헤드 업입니다.
재미있는 팁 :
예를 들어 원격 지점을 가져온 경우 했다 :
git fetch origin feature / 123
그런 다음 원격 디렉토리로 이동합니다. 여전히 로컬 디렉토리에서 사용할 수 없습니다. 그러나 DWIM으로 원격 지점에 대한 체크 아웃을 단순화합니다 (내 말은 Do what I mean).
git checkout 기능 / 123
더 이상 다음을 수행 할 필요가 없습니다.
git checkout -b feature / 123 origin / feature / 123
자세한 내용은 여기를 참조하세요.
|
git pull과 git fetch의 유일한 차이점은 다음과 같습니다.
git pull은 원격 분기에서 가져와 병합합니다.
git fetch는 원격 브랜치에서만 가져 오지만 병합하지는 않습니다.
즉 git pull = git fetch + git merge ...
|
Git을 사용하면 최신 커밋 후에 시간순으로 오래된 커밋을 적용 할 수 있습니다.
이 때문에 저장소간에 커밋을 전송하는 작업은 두 단계로 나뉩니다.
원격 브랜치에서 로컬 리포지토리 내이 원격 브랜치의 복사본으로 새 커밋을 복사합니다.
(repo to repo 작업) master @ remote >> remote / origin / master @ local
새 커밋을 로컬 브랜치에 통합
(inside-repo 작업) remote / origin / master @ local >> master @ local
2 단계를 수행하는 두 가지 방법이 있습니다. 다음을 수행 할 수 있습니다.
마지막 공통 조상 다음에 로컬 브랜치를 포크하고 로컬 저장소에 고유 한 커밋과 병렬로 새 커밋을 추가하고 커밋을 병합하고 포크를 닫습니다.
마지막 공통 조상 뒤에 새 커밋을 삽입하고 로컬 저장소에 고유 한 커밋을 다시 적용합니다.
git 용어에서 1 단계는 git fetch이고 2 단계는 git merge 또는 git rebase입니다.
git pull은 git fetch 및 git merge입니다.
|
Git은 다음 두 명령을 사용하여 원격에서 로컬로 최신 버전의 분기를 가져옵니다.
git fetch : Git은 원격에서 로컬로 최신 버전을 가져 오지만 자동으로 병합되지는 않습니다.
git fetch origin master
git log -p master..origin / master
git merge origin / master
위의 명령은 원점에서 원점 마스터 분기로 최신 버전의 주 분기를 다운로드하는 것을 의미합니다. 그런 다음 로컬 마스터 분기와 원본 마스터 분기를 비교합니다. 마지막으로 병합합니다.
git pull : Git은 원격에서 최신 버전을 가져와 로컬에 병합합니다.
git pull origin master
위의 명령은 git fetch 및 git merge와 동일합니다. 실제로 git fetch는 더 안전 할 수 있습니다. 병합하기 전에 변경 사항을 확인하고 병합할지 여부를 결정할 수 있기 때문입니다.
|
git pull과 git fetch의 차이점은 무엇입니까?
이를 이해하려면 먼저 로컬 git이 로컬 저장소뿐만 아니라 원격 저장소의 로컬 복사본도 유지 관리한다는 사실을 이해해야합니다.
git fetch는 원격 저장소의 로컬 사본을 최신 상태로 만듭니다. 예를 들어 원격 리포지토리가 GitHub 인 경우 원격 리포지토리에서 변경 한 사항을 원격 리포지토리의 로컬 복사본으로 가져올 수 있습니다. 이를 통해 비교 또는 병합과 같은 작업을 수행 할 수 있습니다.
반면에 git pull은 원격 저장소의 변경 사항을 자신의 코드를 보관하는 위치로 가져옵니다. 일반적으로 git pull은 먼저 git fetch를 수행하여 원격 저장소의 로컬 복사본을 최신 상태로 가져온 다음 변경 사항을 자신의 코드 저장소와 작업 복사본에 병합합니다.
|
git pull == (git fetch + git merge)
git fetch는 로컬 브랜치로 변경되지 않습니다.
원하는 프로젝트에 대한 원격 설정이있는 로컬 저장소가 이미있는 경우 git fetch를 사용하여 기존 원격에 대한 모든 분기와 태그를 가져올 수 있습니다. ... Fetch는 로컬 브랜치를 변경하지 않으므로 새로 가져 오기 변경 사항을 통합하려면 원격 브랜치를 쌍을 이룬 로컬 브랜치와 병합해야합니다. github에서
|
초보자를위한 간단한 그래픽 표현,
여기,
git pull
코드를 가져옵니다저장소에서 로컬로 리베이스 ... git pull에서 새로운 커밋이 생성 될 가능성이 있습니다.
하지만에서
자식 가져 오기
저장소에서 코드를 가져오고 git rebase를 사용하여 수동으로 rebase해야합니다.
예 : 서버 마스터에서 가져 와서 로컬 마스터에서 리베이스 할 것입니다.
1) git pull (rebase가 자동으로 수행됨) :
git pull origin master
여기 원점은 원격 저장소 마스터가 지점입니다.
2) git fetch (수동으로 리베이스해야 함) :
git fetch origin master
원본에서 서버 변경 사항을 가져옵니다. 그리고 그것은 당신이 스스로 리베이스 할 때까지 당신의 지역에있을 것입니다. 코드를 확인하여 충돌을 수동으로 수정해야합니다.
git rebase origin / master
이것은 코드를 로컬로 리베이스합니다. 그 전에 올바른 지점에 있는지 확인하십시오.
|
명확하고 단순 해 지려고합니다.
git pull 명령은 실제로 구성에 따라 git fetch 다음에 git merge 또는 git rebase 명령이 따르는 바로 가기입니다. Git 리포지토리를 구성하여 git pull이 가져 오기 후 리베이스되도록 할 수 있습니다.
|
실제로 Git은 자신의 코드 사본을 유지하고
원격 저장소.
git fetch 명령은 원격 저장소에서 데이터를 가져 와서 로컬 사본을 최신 상태로 만듭니다. 이것이 필요한 이유는 다른 누군가가 코드를 변경했을 수 있고 사용자가 자신을 최신 상태로 유지하기를 원하기 때문입니다.
git pull 명령은 원격 저장소의 변경 사항을 자신의 코드를 보관하는 위치로 가져옵니다. 일반적으로 git pull은 먼저 'git fetch'를 수행하여 원격 저장소의 로컬 복사본을 최신 상태로 가져온 다음 변경 사항을 자신의 코드 저장소와 작업 복사본에 병합합니다.
|
1
2
다음
매우 적극적인 질문입니다. 이 질문에 답하기 위해 평판 10을 획득하십시오. 평판 요구 사항은 스팸 및 비 응답 활동으로부터이 질문을 보호하는 데 도움이됩니다.
찾고있는 답변이 아닙니까? git version-control git-pull git-fetch 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.